home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
1122
/
1122.xpi
/
chrome
/
tabmixplus.jar
/
content
/
tabmixplus
/
links
/
setup.js
< prev
next >
Wrap
Text File
|
2009-10-07
|
18KB
|
422 lines
/*
* chrome://tabmixplus/content/links/setup.js
*
* original code by Bradley Chapman
* modified and developped by Hemiola SUN
* modified again by Bradley Chapman
*
*/
var __contentAreaClick;
/**
* @brief Install the link-handling functions of Tab Mix Plus.
*
* @returns Nothing.
*/
function TMP_TBP_init() {
var eStrings = document.getElementById("extensionsStrings");
if (eStrings) {
// we're in the EM
openURL = TMP_openURL;
// catch call to tabmix options from EM
eval("gExtensionsViewController.commands.cmd_options ="+gExtensionsViewController.commands.cmd_options.toString().replace(
'var optionsURL = aSelectedItem.getAttribute("optionsURL");',
'$& \ if (TMP_cmd_options(optionsURL)) return;'
));
}
// with MR Tech's local install
if (typeof(Local_Install) == "object") {
// use TMP call to TMP Options
var _aURL = "'chrome://tabmixplus/content/pref/pref-tabmix.xul'";
eval("Local_Install.createDropDownMenu ="+Local_Install.createDropDownMenu.toString().replace(
'aMenuItem.setAttribute("oncommand", thisAction + "; event.stopPropagation();");',
'if (thisAction.indexOf(_aURL) != -1) thisAction = "TMP_cmd_options(" + _aURL + ")"; \ $&'
));
}
// we need this only for use our loadSearchInBackground pref
var autoComplete = document.getElementById("PopupAutoCompleteRichResult");
if (autoComplete) {
eval("autoComplete.onPopupClick ="+autoComplete.onPopupClick.toString().replace(
'openUILink(url, aEvent);',
'TMP_BrowserLoadURL(aEvent, null, null, url);'
));
}
if ("contentAreaClick" in window) {
__contentAreaClick = window.contentAreaClick;
window.contentAreaClick = TMP_contentAreaClick;
}
window.BrowserOpenTab = TMP_BrowserOpenTab;
window.openUILink = TMP_openUILink;
// BrowserLoadURL removed in Firefox 3.5
if ("BrowserLoadURL" in window)
window.BrowserLoadURL = TMP_BrowserLoadURL;
// for dotCOMplete extensoin
if ("dotCOMplete" in window)
window.dotCOMplete.realBrowserLoadURL = TMP_BrowserLoadURL;
}
/**
* @brief Force-call the window observer at least one time.
*
* @returns Nothing.
*/
function TMP_TBP_Startup() {
try {
// we can not set this eval in TMP_beforStartup because sometimes
// TreeStyleTabBrowser don't exist in that early stage, for example when Torbutton is installed
if ("TreeStyleTabBrowser" in window) {
eval("TreeStyleTabBrowser.prototype.initTabbar =" + TreeStyleTabBrowser.prototype.initTabbar.toString().replace(
'var scrollFrame = document.getAnonymousElementByAttribute(b.mTabContainer, "class", "tabs-frame");',
'var scrollFrame = document.getAnonymousElementByAttribute(b.mTabContainer, "anonid", "scroll-tabs-frame");'
));
}
// session manager extension start to add tab before our onWindowOpen run
// so we initialize this before start
gWidthFitTitle = TMP_getBoolPref(tabxBranch, "flexTabs", false) &&
(TMP_getIntPref("", "browser.tabs.tabMaxWidth", 250) != gTabmixPrefs.getIntPref("browser.tabs.tabMinWidth"));
gTMPprefObserver.init();
// force-call the observer once, in order to kill new windows faster
TMP_DOMWindowOpenObserver.onObserve(window, TMP_DOMWindowOpenObserver);
// make tabmix compatible with ezsidebar extension
var TMP_BrowserStartup = "__ezsidebar__BrowserStartup" in window ? "__ezsidebar__BrowserStartup" : "BrowserStartup";
var bowserStartup = window[TMP_BrowserStartup].toString();
if (gIsFirefox35) {
var pbs = Cc["@mozilla.org/privatebrowsing;1"].
getService(Ci.nsIPrivateBrowsingService);
SessionManager._inPrivateBrowsing = pbs.privateBrowsingEnabled;
bowserStartup = bowserStartup.replace(
'gBrowser.swapBrowsersAndCloseOther(gBrowser.selectedTab, uriToLoad);',
'var remoteBrowser = uriToLoad.ownerDocument.defaultView.gBrowser; \
var url = remoteBrowser.getBrowserForTab(uriToLoad).currentURI.spec; \
var keepLastTab = tabxPrefs.getBoolPref("keepLastTab"); \
if (!keepLastTab && url != "about:blank") \
gBrowser.mTabContainer.removeAttribute("hidebutton"); \
if (!gSingleWindowMode) { \
window.tabmix_afterTabduplicated = true; \
$& \
}'
);
}
var stringBundle = document.getElementById("tmp-string-bundle");
var tabmix_loading = stringBundle.getString("session.loading.label") + "...";
var windowOpeneByTabmix = "tabmixdata" in window;
var firstWindow = numberOfWindows() == 1;
var disAllow = SessionManager._inPrivateBrowsing || TMP_SessionStore.isSessionStoreEnabled() || "gSessionManager" in window;
var sessionManager = gTabmixPrefs.getBoolPref("extensions.tabmix.sessions.manager");
var crashRecovery = gTabmixPrefs.getBoolPref("extensions.tabmix.sessions.crashRecovery");
var afterRestart = false;
var restoreOrAsk = gTabmixPrefs.getIntPref("extensions.tabmix.sessions.onStart") < 2 || afterRestart;
var afterCrash = gTabmixPrefs.prefHasUserValue("extensions.tabmix.sessions.crashed");
// don't load home page on first window if session manager or crash recovery is enabled
window.isLoadHomePage = true;
if (!disAllow && ((sessionManager && windowOpeneByTabmix) ||
(firstWindow && crashRecovery && afterCrash) ||
(firstWindow && sessionManager && restoreOrAsk))) {
bowserStartup = bowserStartup.replace(
'uriToLoad = window.arguments[0];',
'uriToLoad = gHomeButton.getHomePage() == window.arguments[0] ? "about:blank" : window.arguments[0];'
);
bowserStartup = bowserStartup.replace(
'if (window.opener && !window.opener.closed) {',
'if (uriToLoad && uriToLoad != "about:blank")\
for (var i = 0; i < gBrowser.mTabContainer.childNodes.length ; i++)\
gBrowser.mTabContainer.childNodes[i].loadOnStartup = true;\
$&'
);
if (!("TabGroupsManagerApiVer1" in window)) {
bowserStartup = bowserStartup.replace(
'if (window.opener && !window.opener.closed) {',
'if (uriToLoad == "about:blank" || "tabmixdata" in window) {\
var aBrowser = gBrowser.selectedBrowser;\
aBrowser.contentDocument.title = tabmix_loading;\
aBrowser.mIconURL = "chrome://tabmixplus/skin/tmp.png";\
gBrowser.mCurrentTab.setAttribute("image", aBrowser.mIconURL);\
}\
$&'
);
}
}
// call TMP_SessionStore.setService before delayedStartup, so this will run before sessionStore.init
eval("window."+TMP_BrowserStartup+" ="+bowserStartup.replace(
'setTimeout(delayedStartup, 0',
'if (numberOfWindows() == 1) TMP_SessionStore.setService(1, true); \
$&'
));
// look for installed extensions that are incompatible with tabmix
if (gTabmixPrefs.getBoolPref("extensions.tabmix.disableIncompatible")) {
if (typeof(PlacesController) == "function")
window.setTimeout(disableExtensions, 3000, window);
else
disableExtensions();
}
// add tabmix menu item to tab context menu before menumanipulator and MenuEdit initialize
TM_creatMenuItems();
// if nglayout.debug.disable_xul_cache == true sometimes sessionHistory act strange
// especially with many extensions installed
var pref = "nglayout.debug.disable_xul_cache";
if ((!firstWindow && !windowOpeneByTabmix) && gTabmixPrefs.prefHasUserValue(pref) && gTabmixPrefs.getBoolPref(pref))
window.setTimeout(window[TMP_BrowserStartup], 0);
else
window[TMP_BrowserStartup]();
return;
} catch (ex) {TMP_ASSERT(ex);}
}
function TMP_delayedStartup() {
if (gIsFirefox35)
gBrowser.mTabContainer._newTabButtonWidth = gBrowser.mTabContainer.mTabsNewtabButton.boxObject.width;
SessionManager.init();
TMP_ClosedTabs.setButtonDisableState();
gBrowser.mTabContainer.nextTab = 1;
// convert session.rdf to SessionManager extension format
convertSession.startup();
// set title at startup if we not use session manager
// startup page or home page load before bookmarks service
var i;
if (gTabmixPrefs.getBoolPref("extensions.tabmix.titlefrombookmark")) {
for (i = 0; i < gBrowser.mPanelContainer.childNodes.length ; i++) {
var aBrowser = gBrowser.getBrowserAtIndex(i);
var aUrl = aBrowser.contentDocument.baseURI;
aUrl = (aUrl) ? aUrl : aBrowser.currentURI.spec ;
var bookMarkName = getTitleFromBookmark(aUrl);
if (bookMarkName && aBrowser.contentDocument.title != bookMarkName)
aBrowser.contentDocument.title = bookMarkName;
}
}
var toolbox = document.getElementById("navigator-toolbox");
_BrowserToolboxCustomizeDone = toolbox.customizeDone;
toolbox.customizeDone = function TMP_customizeDone(aToolboxChanged) {
_BrowserToolboxCustomizeDone(aToolboxChanged);
try {
if (aToolboxChanged)
TMP_BrowserToolboxCustomizeDone();
// if tabmix option dialog is open update visible buttons and set focus if needed
var optionWindow = gWindowManager.getMostRecentWindow("mozilla:tabmixopt");
if (optionWindow) {
optionWindow.toolbarButtons(window);
if ("_tabmixCustomizeToolbar" in optionWindow) {
delete optionWindow._tabmixCustomizeToolbar;
optionWindow.focus();
}
}
} catch (ex) {TMP_ASSERT(ex, "error in TMP_BrowserToolboxCustomizeDone");}
};
// when we open bookmark in new window
// get bookmark itemId and url - for use in getBookmarkTitle
if ("bookMarkIds" in window) {
var items = window.bookMarkIds.split("|");
for (i = 0; i < items.length ; i++) {
if (items[i] && items[i] > -1)
gBrowser.mTabContainer.childNodes[i].setAttribute("tabmix_bookmarkId", items[i]);
}
delete window.bookMarkIds;
}
}
// this must run before all
function TMP_beforStartup(tabBrowser, aTabContainer) {
// ODFReader change Cc to something else maybe some other extensions do that too !!!
if ("Cc" in window && Cc != Components.classes)
Cc = Components.classes;
if ("Ci" in window && Ci != Components.interfaces)
Ci = Components.interfaces;
// fix bug in backgroundsaver extension
// that extension use function with the name getBoolPref
// we replace it back here
if ("bgSaverInit" in window && "getBoolPref" in window &&
getBoolPref.toString().indexOf("return bgSaverPref.prefHasUserValue(sName)") != -1) {
window.getBoolPref = function getBoolPref ( prefname, def ) {
try {
var pref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
return pref.getBoolPref(prefname);
}
catch(er) { return def; }
}
}
var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
.getService(Components.interfaces.nsIXULAppInfo);
var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
.getService(Components.interfaces.nsIVersionComparator);
gIsFirefox35 = versionChecker.compare(appInfo.version, "3.1a2") > 0;
gIsFirefox36 = versionChecker.compare(appInfo.version, "3.6a1pre") >= 0;
gIsFirefox37 = versionChecker.compare(appInfo.version, "3.7a1pre") >= 0;
gisToolbarMode = "mTabDropIndicator" in tabBrowser;
// fix conflict with Lori extension
// and fix bug in Lori extension that prevent it from closing unread tabs
if ("loriOldRemoveTab" in tabBrowser) {
tabBrowser.removeTab = tabBrowser.loriOldRemoveTab;
delete tabBrowser.loriOldRemoveTab;
eval("tabBrowser.removeTab ="+tabBrowser.removeTab.toString().replace(
'var index = -1;',
'var b = this.getBrowserForTab(aTab); \
if ("loriTabListener" in b) { \
b.loriTabListener.destroy(); \
b.loriTabListener = null; \
} \ $&'
));
}
// we call this here before some other extensions (like Highlander) change handleLinkClick
// don't call openNewWindowWith when we are in single window mode
eval("handleLinkClick ="+handleLinkClick.toString().replace(
'if (event.shiftKey)',
'if (gSingleWindowMode && event.shiftKey) { \
openNewTabWith(href, doc, null, event, false); \
event.stopPropagation(); \
return true; \
} \
$&'
).replace(
'if (tab)',
'if (gSingleWindowMode || tab)'
));
// remove call to "arrowscrollbox" by "this.mTabContainer.mTabstrip" we don't use it in tabmix
eval("tabBrowser.moveTabTo ="+tabBrowser.moveTabTo.toString().replace(
'this.mTabContainer.mTabstrip.scrollBoxObject.ensureElementIsVisible(this.mCurrentTab);',
''
));
var tabContainer = aTabContainer || tabBrowser.mTabContainer ||
document.getAnonymousElementByAttribute(tabBrowser, "anonid", "tabcontainer");
if (gIsFirefox36) {
eval("tabBrowser.addTab ="+tabBrowser.addTab.toString().replace(
'this.tabContainer.mTabstrip._updateScrollButtonsDisabledState();',
''
));
// nsSessionStore.js use this
tabContainer.mTabstrip.__defineGetter__("scrollClientSize", function() {
return tabContainer.mTabstrip.clientWidth;
});
}
else
eval("tabBrowser.addTab ="+tabBrowser.addTab.toString().replace(
'aTabContainer.mTabstrip._updateScrollButtonsDisabledState();',
''
).replace(
'this.mTabContainer.mTabstrip.scrollBoxObject.scrollBy(this.mTabContainer.firstChild.boxObject.width, 0);',
''
));
if (gIsFirefox35) {
// for Firefox 3.5+ //
eval("tabBrowser._endRemoveTab ="+tabBrowser._endRemoveTab.toString().replace(
'setTimeout(_delayedUpdate, 0, this.tabContainer);',
''
).replace(
'this.tabContainer.mTabstrip._updateScrollButtonsDisabledState();',
''
));
tabContainer._fillTrailingGap = function() { }
tabContainer.mTabstrip.scrollBoxObject = tabContainer.tabstrip.boxObject;
}
else {
// for Firefox 3.0.x //
eval("tabBrowser.removeTab ="+tabBrowser.removeTab.toString().replace(
'setTimeout(_delayedUpdate, 0, this.mTabContainer);',
''
).replace(
'tabStrip.scrollBoxObject.getPosition(scrollPos, {});',
'scrollPos.value = -tabStrip.boxObject.width;'
).replace(
'tabStrip.scrollBoxObject.getScrolledSize(scrolledSize, {});',
'scrolledSize.value = 2000;'
));
}
// return true if all tabs in the window are blank
tabBrowser.isBlankWindow = function() {
for (var i = 0; i < this.mTabs.length; i++) {
if (!this.isBlankBrowser(this.getBrowserAtIndex(i)))
return false;
}
return true;
}
tabBrowser.isBlankTab = function(aTab) {
return this.isBlankBrowser(this.getBrowserForTab(aTab));
}
tabBrowser.isBlankNotBusyTab = function TMP_isBlankNotBusyTab(aTab) {
if (aTab.hasAttribute("busy"))
return false;
return this.isBlankBrowser(this.getBrowserForTab(aTab));
}
tabBrowser.isBlankBrowser = function _isBlankBrowser(aBrowser) {
try{
if (!aBrowser)
return true;
return (!aBrowser.sessionHistory || aBrowser.sessionHistory.index < 0 ||
(aBrowser.sessionHistory.count < 2 &&
(!aBrowser.currentURI || aBrowser.currentURI.spec == 'about:blank')));
} catch (ex) {TMP_ASSERT(ex); return true;}
}
if (gisToolbarMode) { // after bug 347930 (not drop on trunk yet)
tabContainer.removeEventListener("overflow", tabBrowser, false);
tabContainer.removeEventListener("underflow", tabBrowser, false);
// mTabDropIndicatorBar removed
tabBrowser.mTabDropIndicatorBar = tabBrowser.mTabDropIndicator.parentNode;
}
else {
tabContainer.mTabstrip.removeEventListener("overflow", tabContainer, false);
tabContainer.mTabstrip.removeEventListener("underflow", tabContainer, false);
}
if (tabContainer.mAllTabsPopup && "_updateTabsVisibilityStatus" in tabContainer.mAllTabsPopup) {
eval("tabContainer.mAllTabsPopup._updateTabsVisibilityStatus ="+tabContainer.mAllTabsPopup._updateTabsVisibilityStatus.toString().replace(
'var tabstripBO = tabContainer.mTabstrip.scrollBoxObject;',
'var tabstripBO = tabContainer.tabstrip.boxObject;'
));
}
// remove tabs-newtab-button after last tab for firefox 3.0
if (!gIsFirefox35) {
var newTabButton = document.getAnonymousElementByAttribute(tabContainer, "class", "tabs-newtab-button");
if (newTabButton)
newTabButton.parentNode.removeChild(newTabButton);
}
try {
if ("TabGroupsManagerApiVer1" in window)
TMP_TabGroupsManager.init(tabContainer);
} catch (ex) {TMP_ASSERT(ex);}
TMP_eventListener.init(tabContainer);
}